"""
该模块包含年级组长相关的视图函数，用于展示和管理年级信息。
"""
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import ListView
from core.models.classinfo import ClassInfo
from core.models.role import Role
from django.db.models import Count, Sum, Avg
from core.models import Student, ClassEvaluation, DisciplineRecord, HonorRecord

class GradeLeaderDashboardView(LoginRequiredMixin, ListView):
    """
    年级组长仪表盘视图

    展示当前年级组长管理的所有班级信息，仅对年级组长角色可见。

    Attributes:
        model: 使用的模型类为ClassInfo
        template_name: 渲染的模板文件路径
        context_object_name: 传递给模板的上下文变量名
    """
    model = ClassInfo
    template_name = 'grade_leader/dashboard.html'
    context_object_name = 'classes'
    paginate_by = 20  # 每页显示20条记录

    def get_queryset(self):
        """
        获取年级组长管理的所有班级查询集

        验证用户角色，如果是校长则可以查看任何年级，如果是年级组长则只能查看自己管理的年级。
        使用select_related优化关联查询。

        :return: 班级查询集
        :rtype: django.db.models.QuerySet
        """
        user = self.request.user
        current_role = self.request.session.get('CURRENT_ROLE')
        grade_id = self.kwargs.get('grade_id')

        # 如果是校长角色且提供了grade_id，则获取指定年级的班级
        if current_role == Role.PRINCIPAL and grade_id:
            return ClassInfo.objects.filter(
                grade_id=grade_id
            ).select_related('grade', 'semester', 'homeroom_teacher')
        # 如果是年级组长，则返回其管理的所有班级
        elif current_role == Role.GRADE_LEADER:
            return ClassInfo.objects.filter(
                grade__grade_leader=user
            ).select_related('grade', 'semester', 'homeroom_teacher')
        # 其他角色返回空查询集
        else:
            return ClassInfo.objects.none()
        
    def get_context_data(self, **kwargs):
        """
        添加额外的上下文数据

        除了默认的上下文数据外，还添加年级信息到上下文中。

        :param kwargs: 关键字参数
        :type kwargs: dict
        :return: 上下文数据
        :rtype: dict
        """
        context = super().get_context_data(**kwargs)
        if self.object_list.exists():
            context['grade'] = self.object_list.first().grade
            grade = context['grade']
            
            # 基本统计信息
            context['class_count'] = self.object_list.count()
            context['student_count'] = Student.objects.filter(classes__grade=grade).count()
            
            # 评价统计 (暂时注释，因为ClassEvaluation模型中没有class_schedule字段)
            # eval_stats = ClassEvaluation.objects.filter(
            #     class_schedule__class_info__grade=grade
            # ).values('evaluation').annotate(count=Count('id'))
            # 确保evaluation_stats包含所有可能的评价等级
            # stats_dict = {item['evaluation']: item['count'] for item in eval_stats}
            context['evaluation_stats'] = {
                'good': 0,
                'medium': 0,
                'poor': 0
            }
            
            # 纪律统计
            context['discipline_count'] = DisciplineRecord.objects.filter(
                student__classes__grade=grade
            ).count()
            
            # 荣誉统计
            context['honor_count'] = HonorRecord.objects.filter(
                student__classes__grade=grade
            ).count()
        return context